import axios from "axios";
import { ElMessage } from "element-plus";
import { API_BASE_URL } from "@/config/api";

// 创建axios实例
const service = axios.create({
  baseURL: API_BASE_URL, // 从配置文件导入
  timeout: 15000, // 请求超时时间（15秒）
  headers: {
    "Content-Type": "application/json;charset=UTF-8",
  },
});

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 从localStorage获取认证信息，添加token等认证信息
    const authStore = localStorage.getItem("auth");
    if (authStore) {
      try {
        const auth = JSON.parse(authStore);
        // 如果有 access_token，则添加 Authorization 头
        if (auth.isAuthenticated && auth.user && auth.user.access_token) {
          // 如果没有 token_type 则缺省用 bearer
          const tokenType = auth.user.token_type || "bearer";
          // 格式为 `${token_type} ${access_token}`
          config.headers.Authorization = `${tokenType} ${auth.user.access_token}`;
        }
        // 如果没有 access_token，则不传 Authorization 头参数
      } catch (e) {
        console.error("解析认证信息失败", e);
      }
    }
    return config;
  },
  (error) => {
    console.error("请求错误", error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    const res = response.data;

    // 如果响应数据格式不符合预期，直接返回原始响应
    if (!res || typeof res !== "object") {
      return response.data;
    }

    // 如果响应体包含code字段，说明是标准格式 {code, message, data}
    if ("code" in res) {
      // code=0表示正常
      if (res.code === 0) {
        return res.data;
      } else {
        // code不为0，表示业务错误
        const message = res.message || "请求失败";
        ElMessage.error(message);
        return Promise.reject(new Error(message));
      }
    } else {
      // 如果没有code字段，直接返回响应数据（可能是直接返回的数据格式）
      return res;
    }
  },
  (error) => {
    // HTTP错误处理
    let message = "请求失败";

    if (error.response) {
      // 服务器返回了错误状态码
      const status = error.response.status;
      switch (status) {
        case 401:
          message = "会话有效期已过,请重新登录";
          // 清除登录状态
          localStorage.removeItem("auth");
          // 跳转到登录页（避免循环引用，使用动态导入）
          if (window.location.pathname !== "/login") {
            window.location.href = "/login";
          }
          break;
        case 403:
          message = "拒绝访问";
          break;
        case 404:
          message = "请求地址不存在";
          break;
        case 500:
          message = "服务器内部错误";
          break;
        default:
          message = error.response.data?.message || `请求失败 (${status})`;
      }
    } else if (error.request) {
      // 请求已发出但没有收到响应
      message = "网络错误，请检查网络连接";
    } else {
      // 其他错误
      message = error.message || "请求失败";
    }

    ElMessage.error(message);
    return Promise.reject(error);
  }
);

export default service;
